package com.cskaoyan.javase.oop3.interface2.basic2;

/**
 * 1，接口的声明特点：
 * 接口的声明中，默认有一个abstract关键字，不用谢，省略了
 * Modifier 'abstract' is redundant for interfaces
 * 也就是说接口中可以有抽象方法
 * 接口的访问权限修饰符，普遍来说 都是public的，因为接口写出来就是为了被实现了
 * 所以使用public修饰鼓励去实现
 *
 * 2，成员特点
 * 成员变量
 * 接口的成员变量默认都是public static final修饰的 都是静态全局常量
 * 普遍来说。不会去写这三个修饰符，直接省略
 * 细节：
 * 1,访问权限修饰符必须是public，不能改的
 * 2,虽然是静态常量，但是不能用静态代码块赋值，必须显式初始化赋值
 * 总结：接口当中，普遍来说，都写抽象方法，很少有人在接口里写成员变量，这里了解即可
 *
 * 插个嘴：
 * 开发中，怎么去写一个接口的实现类，细节问题
 * 普遍来说，开发中，喜欢在接口所属的包下面。创建一个包叫做impl，然后实现类叫XX接口Impl
 * 成员方法
 * 接口中的成员方法默认都是public abstract修饰的
 * 所以接口中都是抽象方法（java8之前）
 * 同样的接口中的抽象方法也是起到占位的作用，子类实现接口，必须重写该方法
 * 接口当中一定没有普通成员方法
 *
 * 不重要，但是希望你了解的知识
 * Java8以后，接口可以允许有默认的具体实现方法
 * 语法：
 * [访问权限修饰符] default 返回值类型 方法名(){
 * }
 * 这个东西有啥用？
 * 可以联想到抽象类，接口的默认方法可以作为子类的一个默认实现
 * 接口的作用是规范，用这种默认实现方法，不好，不合适
 * 如果你有一种方法需要默认实现，直接放抽象类，为啥要放接口呢，接口从设计意义上讲不应该放具体方法
 * 既然不伦不类，为啥Java官方要引入默认方法？
 * 如果接口中有普通抽象方法，意味着子类必须实现否则报错 Java的设计者在设计更新某个接口的时候，它发现这个接口有很多实现类，如果我定义了一个普通抽象方法，我需要在每个实现类当中都去实现这个抽象方法，Java的开发者觉得太麻烦了，有些类我根本不需要实现这个新的接口方法
 * 纯粹是为了偷懒引入了default
 * 其实这种偷懒的方法也不可取，其实直接定义新接口不是更方便吗？
 *
 *
 * 接口中不仅有默认实现方法，还可以写静态的实现方法
 * 强调：接口中写默认实现方法和静态方法都是很奇怪，至少在现在，开发中几乎没人知道接口可以写具体方法，更不会自己去写
 但是这都是有时效的，如果时代变了，食大便了
  流行了，你现在知道了，也不迟
 * 接口中的全部方法默认都是public修饰的，这个改不了
 *
 * 接口中的成员全部默认public修饰，这叫做从骨子里告诉你了，大爷 快过来 快来实现我
 *
 *
 * 构造器
 * 思考：接口有没有构造器？
 * 抽象类的构造器是为了给自身的普通成员变量赋值用的
 * 但是接口中的成员变量 统统是常量
 * 不需要构造器了
 * 再加上接口不能实例化
 * 所以接口不需要构造器
 *
 */
public interface ITest {
    //定义成员变量
    /*int a = 10;
    //Variable 'b' might not have been initialized
    static int b = 10;
    //Modifier 'static' is redundant for interface fields
    static final int C = 10;
    public static final int D = 100;*/
     int a = 10;
    String name ="123" ;
    /*static {
        //Not allowed in interface
        name = "123";
    }*/

    //定义成员方法
    //Modifier 'abstract' is redundant for interface methods
    void test();
    void test2();
    void test3();
    void test4();
    //现在test5 只要在我需要重写类实现类中实现即可
    //不想要重写的，直接继承了，不需要我费劲去重写了
   default void test5(){

   }

    //Interface abstract methods cannot have body
    //public void test2(){
    //}

    //定义Java8之后的默认default方法
    public default void testDefaultMethod(){
        System.out.println("default方法");
    }
    //接口不能实例化，这个方法咋用？接口的子类可以用

    //定义Java8以后的static方法
    public static void testStaticMethod(){
        System.out.println("static方法");
    }
    //Interface abstract methods cannot have body
    //public ITest(){}

}


